#include <bits/stdc++.h>

using namespace std;

int main()
{
    std::multimap<char,int>mymultimap;
    //添加
    mymultimap.insert(std::pair<char, int>('a', 100));
    mymultimap.insert({'b', 20});
    //insert()返回指向当前新插入元素的迭代器
    auto it = mymultimap.insert(std::pair<char, int>('c', 60));


    //自定义比较
    struct classcomp {
        bool operator() (const char& lhs, const char& rhs) const{
            return lhs<rhs;
        }
    };
    std::multimap<char,int,classcomp> fourth;


    //遍历
    mymultimap.insert (std::pair<char,int>('a',10));
    mymultimap.insert (std::pair<char,int>('b',20));
    mymultimap.insert (std::pair<char,int>('b',150));
    for(auto it = mymultimap.begin(); it != mymultimap.end(); ++it)
        std::cout << (*it).first << "=>" << (*it).second << "\n";
    //  output:
    //  a=>10
    //  b=>20;
    //  b=>150;  


    //查找
    std::multimap<char, int> mymm;
    mymm.insert (std::make_pair('x',10));
    mymm.insert (std::make_pair('y',20));
    mymm.insert (std::make_pair('z',30));
    mymm.insert (std::make_pair('z',40));

    auto nums = mymm.count('z'); //'z'的数量
    auto iter = mymm.find('z');  //第一个'z'
    while(nums--){
    cout << iter->second << endl;
    iter++;
    }
    //利用成员函数lower_bound和upper_bound
    //lower_bound返回的迭代器指向第一个具有给定关键字的元素，upper_bound返回的迭代器指向最后一个匹配给定关键字的元素之后的位置。
    //如果查找元素不存在，两个函数返回的迭代器相等--指向一个不影响排序的关键字插入位置。
    for(auto beg = mymm.lower_bound('z'), end = mymm.upper_bound('z'); beg != end; ++beg)
        cout << beg->second << endl;

    //euqal_range接受一个查找关键字，返回一个迭代器pair。
    //若关键字存在，则第一个迭代器指向第一个与关键字匹配的元素，第二个迭代器指向最后一个匹配元素之后的位置。
    //若未找到匹配元素，则两个迭代器都指向关键字可以插入的位置。

    for(auto pos = mymm.equal_range('z'); pos.first != pos.second; ++pos.first)
        cout << pos.first->second << endl;



    //删除
    //删除指定键值：mymm.erase('a')，返回删除的元素数量
    //传入一个迭代器：
    it = mymm.find('a');
    mymm.erase(it);
    //传入两个迭代器，删除一定范围元素
    mymm.erase(it, mymm.end());
}


